unit ruoliutenti_frm;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, db, FileUtil, LResources, Forms, Controls, Graphics,
  Dialogs, DBGrids, StdCtrls, ZDataset, anagruoli_frm;

type

  { Truoliutenti }

  Truoliutenti = class(TForm)
    btCarica: TButton;
    btElimina: TButton;
    btNuovoRuolo: TButton;
    cbRuoli: TComboBox;
    ds_utenti: TDatasource;
    ds_utentiruoli: TDatasource;
    grigliautenti: TDBGrid;
    grigliautentiruoli: TDBGrid;
    lblRuolo: TLabel;
    zq_utenti: TZReadOnlyQuery;
    zq_ruoli: TZReadOnlyQuery;
    zq_utentiruoli: TZReadOnlyQuery;
    procedure btCaricaClick(Sender: TObject);
    procedure btEliminaClick(Sender: TObject);
    procedure btNuovoRuoloClick(Sender: TObject);
    procedure cbRuoliChange(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormShow(Sender: TObject);
    procedure LoadComboRuoli();
    procedure LoadUtenti();
    procedure LoadUtentiRuoli();
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  ruoliutenti: Truoliutenti;
  anagruoli: Tanagruoli;

implementation

{ Truoliutenti }

procedure Truoliutenti.FormShow(Sender: TObject);
begin
  //seleziono tutti i ruoli e li visualizzo nella combobox
  LoadComboRuoli();
  LoadUtenti();
  LoadUtentiRuoli();
end;

procedure Truoliutenti.FormClose(Sender: TObject; var CloseAction: TCloseAction
  );
begin
  CloseAction:=cafree;
end;

procedure Truoliutenti.btCaricaClick(Sender: TObject);
begin
   ////////////////////////////////////////////////////
   //Controlli ////////////////////////////////////////
   ////////////////////////////////////////////////////
   //Controllo selezione utente da inserire
   if zq_utenti.RecordCount=0 then
   begin
      ShowMessage('Nessun utente inserito.');
      grigliautenti.SetFocus;
      Exit();
   end;

   //Controllo ruolo selezionato su combo
   if cbRuoli.Text='' then
   begin
      ShowMessage('Seleziona un ruolo.');
      cbRuoli.SetFocus;
      Exit();
   end;

   //Controllo che l'associazione non sia già esistente
   with zq_ruoli do
   begin
      Close;
      sql.Clear;
      sql.Add('SELECT * FROM UTENTI_RUOLI WHERE IDUTENTE=:IDUTENTE AND IDRUOLO=:IDRUOLO');
      ParamByName('IDUTENTE').AsInteger:=zq_utenti.FieldByName('IDUTENTE').AsInteger;
      ParamByName('IDRUOLO').Asinteger:=integer(cbRuoli.Items.Objects[cbRuoli.ItemIndex]);
      ExecSQL;
      Open;
      if zq_ruoli.RecordCount>0 then
      begin
        ShowMessage('Attenzione l''utente selezionato possiede già l''associazione al ruolo.');
        Exit();
      end;
   end;

   //Inserimento relazione utente ruolo
   with zq_ruoli do
   begin
      Close;
      sql.Clear;
      sql.Add('INSERT INTO UTENTI_RUOLI ('+
         'IDUTENTE,'+
         'IDRUOLO ' +
         ') VALUES (:IDUTENTE,:IDRUOLO)');
      ParamByName('IDUTENTE').AsInteger:=zq_utenti.FieldByName('IDUTENTE').AsInteger;
      ParamByName('IDRUOLO').Asinteger:=integer(cbRuoli.Items.Objects[cbRuoli.ItemIndex]);

      ExecSQL;

   end;

   //Reload delle relazioni utente ruolo
   LoadUtentiRuoli();
end;

procedure Truoliutenti.btEliminaClick(Sender: TObject);
begin
   ////////////////////////////////////////////////////
   //Controlli ////////////////////////////////////////
   ////////////////////////////////////////////////////
   //Controllo selezione utente associato al ruolo
   if zq_utentiruoli.RecordCount=0 then
   begin
      ShowMessage('Seleziona un utente da eliminare.');
      grigliautentiruoli.SetFocus;
      Exit();
   end;

   //Controllo ruolo selezionato su combo
   if cbRuoli.Text='' then
   begin
      ShowMessage('Seleziona un ruolo.');
      cbRuoli.SetFocus;
      Exit();
   end;

   //Eliminazione della relazione utente ruolo
   with zq_ruoli do
   begin
      Close;
      sql.Clear;
      sql.Add('DELETE FROM UTENTI_RUOLI WHERE IDUTENTE=:IDUTENTE AND IDRUOLO=:IDRUOLO');
      ParamByName('IDUTENTE').AsInteger:= zq_utentiruoli.FieldByName('IDUTENTE').AsInteger;
      ParamByName('IDRUOLO').Asinteger:=integer(cbRuoli.Items.Objects[cbRuoli.ItemIndex]);
      ExecSQL;
   end;

   LoadUtentiRuoli();
end;

procedure Truoliutenti.btNuovoRuoloClick(Sender: TObject);
begin
  //Apro la form ruoli
  anagruoli := Tanagruoli.Create(self);
  anagruoli.idruolo_sel:=integer(cbRuoli.Items.Objects[cbRuoli.ItemIndex]);
  anagruoli.showmodal;
  LoadComboRuoli();
  LoadUtentiRuoli();
end;

procedure Truoliutenti.cbRuoliChange(Sender: TObject);
begin
  LoadUtentiRuoli();
end;


procedure Truoliutenti.LoadComboRuoli();
begin
  //svuota combo
  cbRuoli.Clear;
  with zq_ruoli do
  begin
       Close;
       sql.Clear;
       sql.Add('SELECT IDRUOLO,DESCRUOLO FROM RUOLI');
       ExecSQL;
       Open;
       while not EOF do
       begin
            cbRuoli.Items.AddObject(FieldByName('DESCRUOLO').AsString,TObject(FieldByName('IDRUOLO').AsInteger));
            Next;
       end;
  end
end;

procedure Truoliutenti.LoadUtenti();
begin
 //Load di tutti gli utenti
   with zq_utenti do
   begin
        //seleziono tutti i campi che fanno capo a questo id
        close;
        sql.clear;
        sql.add('SELECT UTE.IDUTENTE,SOG.NOME,SOG.COGNOME FROM UTENTI AS UTE ');
        SQL.Add('INNER JOIN ANAGSOGGETTI AS SOG ON UTE.IDSOGGETTO=SOG.IDSOGGETTO');
        sql.Add('ORDER BY UTE.IDUTENTE');
        ExecSQL;
        open;
   end;
   With grigliautenti do
   begin
       Columns[0].Width:=50;
       Columns[1].Width:=100;
       Columns[2].Width:=100;
       Columns[0].Title.Caption:='ID';
       Columns[1].Title.Caption:='Nome';
       Columns[2].Title.Caption:='Cognome';

   end;
end;

procedure Truoliutenti.LoadUtentiRuoli();
begin
 //Load di tutti gli utenti
   with zq_utentiruoli do
   begin
        //seleziono tutti i campi che fanno capo a questo id
        close;
        sql.clear;
        sql.add('SELECT UTE_R.IDUTENTE,SOG.NOME,SOG.COGNOME FROM UTENTI_RUOLI AS UTE_R');
        SQL.Add('INNER JOIN UTENTI AS UTE ON UTE_R.IDUTENTE=UTE.IDUTENTE');
        SQL.Add('INNER JOIN ANAGSOGGETTI AS SOG ON UTE.IDSOGGETTO=SOG.IDSOGGETTO');
        SQL.Add('WHERE UTE_R.IDRUOLO=:IDRUOLO');
        sql.Add('ORDER BY UTE_R.IDUTENTE');
        ParamByName('IDRUOLO').AsInteger:= integer(cbRuoli.Items.Objects[cbRuoli.ItemIndex]);
        ExecSQL;
        open;
   end;
   With grigliautentiruoli do
   begin
       Columns[0].Width:=50;
       Columns[1].Width:=100;
       Columns[2].Width:=100;
       Columns[0].Title.Caption:='ID';
       Columns[1].Title.Caption:='Nome';
       Columns[2].Title.Caption:='Cognome';

   end;
end;

initialization
  {$I ruoliutenti_frm.lrs}

end.

